python asyncio
high level, low levelの2つがある。network系はどっちをやってるかわからなくなってきたので、整理しておきたい
いろんな記事をみるときに、どっちのことをやってるかは意識しておきたい。慣れないうちは。
high level
一般的な coroutineやtask処理(これでも十分に難しい)
network(stream) , open_connectでread, writeハンドラーを引数にとるファクトリ関数を引数にいれておく。
low level
イベントループからの直接メソッド。loop.xxxxみたいな
coroutineを(イベントループで)実行する。run, run_until_complete, run_forever
callbackをschedulingする。すぐに実行(scheduling, promise化?) 一定時間後にもできる。
high levelなら asyncio.wait_for()
An instance of asyncio.Handle is returned, which can be used later to cancel the callback.
返り値をもっておいて、(何秒以内に)キャンセルみたいなこともできそう。
create_task, create_future
third party event loops ... とあるので、通常は、 high levelの asyncio.create_task, futureを使っていくのかな。
open network connection
high levelだと start_serverで一発で serverコルーチンオブジェクトを得て、実行すればよかったが、
low levelだとcreate_serverで、プロトコル(baseはある)を自前で設定したファクトリ関数?を渡せる
ここで、protocolやtransport部分を触ることができる。
こちらがわかりやすい
最初にhigh levelの記述があって、read,write handlerに加えて pathを渡して(クロージャ?して関数、 ドキュメントはpartialを使えとも書いてある。どっちも同じかな) low levelのサンプルもある。
coroutine
t1 = asyncio.create_task(coro); await t1
await asyncio.create_task(coro) みたいにすると、task(concurrentに複数tasksに対処する)にならない?
awaitable(3つのawaitableを説明してる?)
coroutineとtaskの違いの話?
coroutineをawaitなしで読んでも coroutineオブジェクトができるだけで、何も起きないよ?
task
coroutineをtaskでwrap create_task(coro) すると、すぐに実行するようにscheduleされる
なので、複数taskを走らせると、concurrentにtaskがwork状態に入る.
(awaitされないと, ボールを渡されないと何もしないけど?)
future
awaitしたときには、resolveされるまで待つよ。
通常、アプリ側で書くことはない?から、気にしなくてよい?
loop.run_in_executor()のような 低レベルAPIには出てくる。
というのも、ループはブロッキングI/Oについて上手くこなす術を知っているんです。
ざっくり言うと、一時停止と再開が可能で外からコントロールできる関数がcoroutineです。 code:python
async def xxx: ....; while:; await yyyy......